const express = require('express')
const router = express.Router()
const models = require('../../models')
const {success, error} = require('../../utils/message')
const checkPermission = require('../../middlewares/check-permission');
const {redisClient} = require('../../utils/redis-client');

/**
 * GET /admin/roles
 * 列表
 */
router.get('/', checkPermission(), async function (req, res, next) {
    let roles = await models.Role.findAll({
        order: [
            ['sort', 'ASC'],
        ],
    })

    success(res, '查询成功', {roles})
})

/**
 * POST /admin/roles
 * 新增
 */
router.post('/', checkPermission(), async function (req, res, next) {
    const name = req.body.name
    const sort = req.body.sort

    if (!name) {
        return error(res, '请填写用户组名称')
    }

    let role = await models.Role.findOne({where: {name: name}})
    if (role) {
        return error(res, '当前用户组已经存在，请换一个用户组名称')
    }

    if (!req.body.sort) {
        return error(res, '请填写排序')
    }

    if (!Number(sort)) {
        return error(res, '排序必须是数字')
    }

    role = await models.Role.create(req.body)

    // 设置当前用户组的权限
    await role.setPermissions(req.body.permissions)

    success(res, '新增成功', {role})
})

/**
 * GET /admin/roles/:id
 * 查询单条
 */
router.get('/:id', checkPermission(), async function (req, res, next) {
    const role = await models.Role.findByPk(req.params.id)
    if (!role) {
        return error(res, '当前用户组不存在')
    }

    // 用户组的权限列表
    const permissions = await role.getPermissions()

    success(res, '查询成功', {role, permissions})
})

/**
 * PUT /admin/roles/:id
 * 修改
 */
router.put('/:id', checkPermission(), async function (req, res, next) {
    const id = req.params.id
    const name = req.body.name
    const sort = req.body.sort

    if (!name) {
        return error(res, '请填写名称')
    }

    if (!sort) {
        return error(res, '请填写排序')
    }

    if (!Number(sort)) {
        return error(res, '排序必须是数字')
    }

    const role = await models.Role.findByPk(id)
    if (!role) {
        return error(res, '当前用户组不存在，无法修改')
    }

    // 更新用户组信息
    role.update({name, sort})

    // 设置当前用户组的权限
    await role.setPermissions(req.body.permissions)

    // 删除用户组权限缓存
    const client = await redisClient()
    client.del(`roles:${id}:permissions`)

    success(res, '修改成功', {role})
})

/**
 * DELETE /admin/roles/:id
 * 删除
 */
router.delete('/:id', checkPermission(), async function (req, res, next) {
    const id = req.params.id
    const role = await models.Role.findByPk(id)

    if (!role) {
        return error(res, '当前用户组不存在，无法删除')
    }

    const users = await models.User.count({where: {'roleId': id}})
    if (users > 0) {
        return error(res, '当前用户组有用户，不能删除。请先将用户改为其他用户组后，再来操作！')
    }

    const rolePermissions = await models.RolePermission.count({ where: { 'roleId': id } })
    if (rolePermissions.length > 0) {
      return error(res, '当前用户组有菜单与权限设置，不能删除！')
    }

    await role.setPermissions([])
    await role.destroy()
    success(res, '删除成功')
})

/**
 * PATCH /admin/roles/:id/change_sort
 * 修改排序
 */
router.patch('/:id/change_sort', checkPermission(), async function (req, res, next) {
    const id = req.params.id
    const sort = req.body.sort

    if (!sort) {
        return error(res, '请填写排序')
    }

    if (!Number(sort)) {
        return error(res, '排序必须是数字')
    }

    const role = await models.Role.findByPk(id)
    if (!role) {
        return error(res, '当前用户组不存在，无法修改排序')
    }

    role.update({sort: sort})
    success(res, '修改排序成功 ')
})

module.exports = router
